package main

import (
	"bufio"
	"fmt"
	"os"
)

/**
defer
1、主要用于对于资源的释放
2、defer 会在return 返回之后执行的
*/
func createFile(filepath string) {
	file, e := os.Create(filepath)
	if e != nil {
		panic(e)
	}
	defer file.Close()

	writer := bufio.NewWriter(file)
	//文件写入完成后在 关闭bufio
	defer writer.Flush()
	//_, err := writer.WriteString("我在学习处理defer 处理异常")
	_, err := fmt.Fprintln(writer, "文件不存在，给文件写入的内容")
	if err != nil {
		panic(fmt.Sprintf("writer data err %v \n", err))
	}
}

func mkFiles() {
	//声明一个切片（文件名称数组）
	fileName := []string{"1.txt", "2.txt", "3.txt"}
	fileName = append(fileName, "4.txt")
	filePath := "F:/filetest/test/"
	//批量创建文件夹
	for _, v := range fileName {
		pathAll := fmt.Sprintf("%s%s", filePath, v)
		//判断该文件是否存在
		_, e := os.Open(pathAll)
		if os.IsNotExist(e) {
			fmt.Println("不存在")
			//创建文件路经
			os.MkdirAll(filePath, 6666)
			//创建文件
			createFile(pathAll)
		} else {
			fmt.Println("存在")
			/**
			打开文件给文件中写入数据，
			*/
			file, err := os.OpenFile(pathAll, os.O_RDWR, 0)
			if err != nil {
				fmt.Println(err)
			}
			defer file.Close()
			b := bufio.NewWriter(file)
			defer b.Flush()
			fmt.Fprintln(b, "文件存在呢，重新文件内容")
		}
	}
}

func main() {
	//mkFiles()
	s := deferTest()
	fmt.Println(s)
}

/**
1、多个defer的执行顺序为“后进先出”；
2、defer、return、返回值三者的执行逻辑应该是：
return最先执行，return负责将结果写入返回值中；接着defer开始执行一些收尾工作；最后函数携带当前返回值退出。
*/

//defer 的 在函数执行完成后才会进行调用执行

func deferTest() string {
	defer fmt.Println("执行 defer")
	fmt.Println("defer in ")
	return "hello defer"
}
